﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using System.Drawing;

namespace GestionEco
{
    public abstract class EtreVivant
	{
        public const int POINTS_REPRODUIRE = 6;
        public const int POINTS_BOIRE = 2;
        public const int POINTS_MANGER = 4;

        protected string NomEtre;
        protected Image ImageEtre;
        protected Texture2D texture;
        protected Vector2 CoordonneeCase;
        protected string[] typeTerrain;
        protected int vieMax;
        protected int vieActuelle;
        protected int attaque;
        protected int esquive;
        protected int degats;
        protected int vue;
        protected int age;
        protected int majorite;
        protected int regen;
        protected int faimMax;
        protected int faimActuelle;
        protected int soifMax;
        protected int soifActuelle;
        private int pointsActionActuels;
        //true -> male , false -> femelle
        protected bool sexe;
        public EtreVivant(string n, Image img)
        {
            this.NomEtre = n;
            this.ImageEtre = img;
            this.age = 0;
            
        }

        
        #region assesseurs
        public Image getImageEtre()
        {
            return this.ImageEtre;
        }

        public void setImageEtre(Image i)
        {
            this.ImageEtre = i;
        }
        public Texture2D getTexture()
        {
            return this.texture;
        }

        public void setTexture(Texture2D text)
        {
            this.texture = text;
        }

        public string getNomEtre()
        {
            return this.NomEtre;
        }

        public virtual string[] getTypeTerrain()
        {
            return this.typeTerrain;
        }

        public int getVieMax()
        {
            return vieMax;
        }

        public int getVieActuelle()
        {
            return vieActuelle;
        }

        public int getAttaque()
        {
            return attaque;
        }

        public int getEsquive()
        {
            return esquive;
        }

        public int getDegat()
        {
            return degats;
        }

        public int getVue()
        {
            return vue;
        }

        public int getRegen()
        {
            return regen;
        }

        public int getFaimMax()
        {
            return faimMax;
        }

        public int getFaimActuelle()
        {
            return faimActuelle;
        }

        public int getSoifMax()
        {
            return soifMax;
        }

        public int getSoifActuelle()
        {
            return soifActuelle;
        }

        public int PointsActionActuels
        {
            get { return pointsActionActuels; }
            set { pointsActionActuels = value; }
        }

        public int getAge()
        {
            return this.age;
        }

        public int getMajorite()
        {
            return majorite;
        }

        public bool getSexe()
        {
            return this.sexe;
        }

        public void setVieActuelle(int va)
        {
            this.vieActuelle = va;
        }

        public void setAge(int a)
        {
            this.age = a;
        }

        public void setSoifActuelle(int sa)
        {
            this.soifActuelle = sa;
        }

        public void getFaimActuelle(int fa)
        {
            this.faimActuelle = fa;
        }
        #endregion

        //methode pour savoir si un etre vivant peut effectuer une action
        protected virtual bool retraitPoints(int nb)
        {
            if (this.PointsActionActuels >= nb)
            {
                this.PointsActionActuels -= nb;
                return true;
            }
            else
            {
                return false;
            }
        }

        public virtual void seDeplacer()
        {

        }

        public virtual void seRegenerer()
        {

        }

        public virtual void vieillir()
        {
            // on ajoute 1 a l'age de l'animal
            this.age += 1;
        }

        public void boire(Terrain unTerrain)
        {
            if (!retraitPoints(POINTS_BOIRE))
            {
                Console.WriteLine("Plus de points d'action pour boire");
            }
            else
            {
                //si plus d'eau que soifmax
                if (unTerrain.getQteEauActuelle() >= this.soifMax)
                {
                    this.soifActuelle = this.soifMax;
                }
                else
                {
                    this.soifActuelle += unTerrain.getQteEauActuelle();
                    if (this.soifActuelle > this.soifMax)
                    {
                        this.soifActuelle = this.soifMax;
                    }
                }
                //Qte d'eau restante dans la case
                unTerrain.setQteEauActuelle((this.soifMax - this.soifActuelle) - unTerrain.getQteEauActuelle());
            }
        }

        public abstract EtreVivant seReproduire(EtreVivant e);
        public abstract void seNourrir(EtreVivant e);
    }
}
